function [T_A, T_B, B_rs] = transfer_block_design(B)
% TRANSFER_BLOCK_DESIGN 转移块设计（公式43-46）
%   输入：
%     B: [b×K]原始基带预编码矩阵
%   输出：
%     T_A, T_B: [b×K]转移块矩阵（相位调制器实现）
%     B_rs: [K×K]降维基带预编码矩阵
%
%   文献依据：公式(43-46)

    % ========== 1. 参数验证 ==========
    [b, K] = size(B);
%     validate_B_matrix(B);
    
    % ========== 2. 计算缩放因子μ（公式46） ==========
    % 公式46：μ = 0.5 * max_{i,q} |B(i,q)|
    B_abs = abs(B);
    mu = 0.5 * max(B_abs(:));
    
    % 处理全零矩阵
    if mu == 0
        warning('输入矩阵B全零，使用单位矩阵作为转移块');
        T_A = ones(b, K);
        T_B = ones(b, K);
        B_rs = eye(K);
        return;
    end
    
    % ========== 3. 构建转移块矩阵（公式46） ==========
    T_A = zeros(b, K);
    T_B = zeros(b, K);
    
    for i = 1:b
        for q = 1:K
            % 3.1 提取当前元素
            B_iq = B(i, q);
            
            % 3.2 计算相位偏移量
            phase = angle(B_iq);
            offset = acos(B_abs(i, q) / (2 * mu));
            
            % 3.3 构建T_A和T_B元素（公式46）
            T_A(i, q) = exp(1i * (phase + offset));
            T_B(i, q) = exp(1i * (phase - offset));
        end
    end
    
    % ========== 4. 计算降维预编码器（公式43） ==========
    % 公式43：min_{T_A,T_B,B_rs} ||B - (T_A + T_B) B_rs||_F^2
    T = T_A + T_B;
    
    % Moore-Penrose伪逆求解
    B_rs = pinv(T) * B;
    
    % ========== 5. 功率约束处理 ==========
    % 文献未明确说明，但需满足总功率约束
    pow_original = norm(B, 'fro')^2;
    pow_new = norm(T * B_rs, 'fro')^2;
    scaling_factor = sqrt(pow_original / pow_new);
    B_rs = scaling_factor * B_rs;
    
    % ========== 6. 验证性能 ==========
%     validate_transfer_block(B, T_A, T_B, B_rs);
end

%% ========== 子函数：输入矩阵验证 ==========
function validate_B_matrix(B)
    % 维度验证
    [b, K] = size(B);
    if b < K
        error('B矩阵列数K必须小于或等于行数b');
    end
    
    % 复数验证
    if isreal(B)
        warning('输入矩阵B为实数，预期为复数预编码矩阵');
    end
end

%% ========== 子函数：转移块验证 ==========
function validate_transfer_block(B, T_A, T_B, B_rs)
    % 1. 重构预编码矩阵
    T = T_A + T_B;
    B_recon = T * B_rs;
    
    % 2. 计算重构误差
    recon_error = norm(B - B_recon, 'fro') / norm(B, 'fro');
    if recon_error > 1e-3
        warning('转移块重构误差较大: %.2e', recon_error);
    end
    
    % 3. 恒模约束验证
    T_A_abs = abs(T_A(:));
    T_B_abs = abs(T_B(:));
    
    if any(abs(T_A_abs - 1) > 1e-6) || any(abs(T_B_abs - 1) > 1e-6)
        error('转移块不满足恒模约束');
    end
    
    % 4. 相位调制器实现验证
    phase_diff = angle(T_A) - angle(T_B);
    expected_diff = 2 * acos(abs(B) / (2 * 0.5 * max(abs(B(:)))));
    phase_error = norm(phase_diff(:) - expected_diff(:), 'fro');
    
    if phase_error > 1e-3
        warning('相位差计算误差: %.2e', phase_error);
    end
end

%% ========== 子函数：可视化验证 ==========
function visualize_transfer_design(B, T_A, T_B, B_rs)
    % 创建可视化
    figure('Position', [100, 100, 1200, 800]);
    
    % 1. 原始预编码矩阵幅度
    subplot(2,3,1);
    imagesc(abs(B));
    colorbar;
    title('原始预编码 |B|');
    xlabel('用户索引');
    ylabel('RF链索引');
    
    % 2. 转移块T_A相位
    subplot(2,3,2);
    imagesc(angle(T_A));
    colorbar;
    title('转移块T_A相位');
    
    % 3. 转移块T_B相位
    subplot(2,3,3);
    imagesc(angle(T_B));
    colorbar;
    title('转移块T_B相位');
    
    % 4. 降维预编码矩阵
    subplot(2,3,4);
    imagesc(abs(B_rs));
    colorbar;
    title('降维预编码 |B_{rs}|');
    xlabel('用户索引');
    ylabel('用户索引');
    
    % 5. 重构误差
    B_recon = (T_A + T_B) * B_rs;
    error_matrix = abs(B - B_recon);
    subplot(2,3,5);
    imagesc(error_matrix);
    colorbar;
    title(sprintf('重构误差 (Fro: %.2e)', norm(error_matrix,'fro')));
    
    % 6. 相位差分布
    subplot(2,3,6);
    phase_diff = angle(T_A) - angle(T_B);
    histogram(phase_diff(:), 50);
    title('T_A与T_B相位差分布');
    xlabel('相位差 (弧度)');
    ylabel('频次');
    
    % 保存文献对应图示
    saveas(gcf, 'transfer_block_design_visualization.png');
end